package handlers

import (
    "encoding/json"
    "net/http"
    "shopping-backend/models"
    "strconv"
    "github.com/gorilla/mux"
    "time"
)

// 获取用户的订单信息
    // @Summary 获取订单信息
    // @Description 根据订单ID获取订单详情。
    // @Tags 订单
    // @Accept json
    // @Produce json
    // @Param order_id path int true "订单ID"
    // @Success 200 {object} models.Order "订单信息"
    // @Failure 400 {string} string "无效的订单ID"
    // @Failure 404 {string} string "订单未找到"
    // @Failure 500 {string} string "服务器内部错误"
    // @Router /orders/{order_id} [get]
func GetOrder(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    orderID, err := strconv.Atoi(vars["order_id"])
    if err != nil {
        http.Error(w, "无效的订单ID", http.StatusBadRequest)
        return
    }

    // 获取订单信息
    order, err := models.GetOrderByID(orderID)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    if order == (models.Order{}) { // 如果没有找到订单
        http.Error(w, "订单未找到", http.StatusNotFound)
        return
    }

    // 返回订单信息
    json.NewEncoder(w).Encode(order)
}

// AddOrder 用于创建新订单
    // @Summary 创建订单
    // @Description 根据请求体中的数据创建新的订单。
    // @Tags 订单
    // @Accept json
    // @Produce json
    // @Param order body models.Order true "订单信息"
    // @Success 201 {string} interface{} "返回创建的订单信息"
    // @Failure 400 {string} string "无效数量或总数"
    // @Failure 500 {string} string "保存订单时出错"
    // @Router /orders [post]
func AddOrder(w http.ResponseWriter, r *http.Request) {
    var order models.Order
    // 解析请求体中的 JSON 数据到 order 结构体
    if err := json.NewDecoder(r.Body).Decode(&order); err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }

    // 校验订单信息（例如数量和价格不能为负数）
    if order.Quantity <= 0 || order.TotalAmount <= 0 {
        http.Error(w, "无效数量或总数", http.StatusBadRequest)
        return
    }

    // 设置当前时间作为订单日期
    order.OrderDate = time.Now()

    // 调用模型层的 AddOrder 函数来将订单添加到数据库
    orderID, err := models.AddOrder(order)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    // 成功创建订单后，返回 201 Created 状态和订单 ID
    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusCreated) // HTTP 201 Created

    // 返回创建的订单 ID
    json.NewEncoder(w).Encode(map[string]interface{}{
        "message": "订单创建成功",
        "order_id": orderID,
    })
}

// DeleteOrder 用于删除指定 ID 的订单
    // @Summary 删除订单
    // @Description 根据订单ID删除订单。
    // @Tags 订单
    // @Produce json
    // @Param order_id path int true "订单ID"
    // @Success 200 {string} string "订单删除成功"
    // @Failure 400 {string} string "无效的订单ID"
    // @Failure 404 {string} string "订单未找到"
    // @Failure 500 {string} string "服务器内部错误"
    // @Router /orders/{order_id} [delete]
func DeleteOrder(w http.ResponseWriter, r *http.Request) {
    // 从 URL 中提取订单 ID
    vars := mux.Vars(r)
    orderIDStr := vars["order_id"]

    // 将 id 从字符串转换为整数
    orderID, err := strconv.Atoi(orderIDStr)
    if err != nil {
        http.Error(w, "无效的订单ID", http.StatusBadRequest)
        return
    }

    // 调用模型层的 DeleteOrder 函数来删除订单
    rowsAffected, err := models.DeleteOrder(orderID)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    // 检查是否有订单被删除
    if rowsAffected == 0 {
        http.Error(w, "订单未找到", http.StatusNotFound)
        return
    }

    // 删除成功后，返回 200 OK 状态
    w.WriteHeader(http.StatusOK)
    json.NewEncoder(w).Encode(map[string]string{
        "message": "订单删除成功",
    })
}
